package main

// 777. 在LR字符串中交换相邻字符
// 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串
// （例如"RXXLRXRXL"）中进行移动操作。一次移动操作指用一个"LX"替换一个"XL"，
// 或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end，
// 请编写代码，当且仅当存在一系列移动操作使得start可以转换成end时， 返回True。


func canTransform(start string, end string) bool {
	if len(start) != len(end) {
		return false
	}
	n := len(end)
	if n == 1 && start[:n] != end[:n] {
		return false
	}
	// 移位操作   xl替换成LX，看作L左移；同理，R右移
	// L R只能穿透X
	// L R相对顺序不变；L在end中坐标小于等于在start中的下标；R则反之
	i, j := 0, 0 //  对应start end的下标
	for i < n && j < n {
		for i < n && start[i] == 'X' {
			i++
		}
		for j < n && end[j] == 'X' {
			j++
		}
		if i < n && j < n {
			if start[i] != end[j] {
				return false
			}
			c := start[i]
			if c == 'L' && i < j || c == 'R' && i > j {
				// L只能左移  R只能右移；
				// 因此start中的L应该大于等于在end中L
				// R反之
				return false
			}
			i++
			j++
		}

	}
	// 如果某个到达n，则遍历另一剩余字符，如果出现非X，则false
	for i < n {
		if start[i] != 'X' {
			return false
		}
		i++
	}
	for j < n {
		if end[j] != 'X' {
			return false
		}
		j++
	}
	return true
}
